/*
 * @Author: gggg 1263457581@qq.com
 * @Date: 2025-06-10 11:32:14
 * @LastEditors: gggg 1263457581@qq.com
 * @LastEditTime: 2025-06-10 11:39:15
 * @FilePath: /algorithm-and-data-struct/c++11/cast_test.cpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
using namespace std;
class Base {
public:
    virtual void print() {
        std::cout << "Base" << std::endl;
    }
};
class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived" << std::endl;
    }
};
int main()
{
    

    // 1. static_cast, 用于基本数据类型之间的转换，如int到float的转换
    int a= 10;
    float b = static_cast<float>(a);

    // 2. dynamic_cast, 用于将一个指针或引用转换为另一个类型
    Base *p = new Derived();
    Derived *q = dynamic_cast<Derived*>(p);
    //如果转换失败，返回nullptr（指针转换）或抛出std::bad_cast异常（引用转换)
    if (q != nullptr) {
        q->print();
    }

    // 3. reinterpret_cast, 用于将一个指针或引用转换为另一个类型
    // 用于不同类型的指针之间的转换，或者将指针转换为足够大的整数类型
    int *p1 = new int(10);
    void *p2 = reinterpret_cast<void*>(p1);
    int *p3 = reinterpret_cast<int*>(p2);
    cout << *p3 << endl;

    //4. const_cast, 用于去除const或volatile修饰符
    const int aa = 10;
    int* pp = const_cast<int*>(&aa); // 移除a的const属性，现在p可以修改a的值

}